今天要延續昨天的內容,繼續了解 BERT 是什麼,今天會著重在 BERT Pre-training 的過程。為什麼我們要了解 BERT Pre-training 過程呢?Google 不是都訓練好了,我們直接取用就可以麼嗎?
其實就是因為我們沒有資源自己訓練一個 BERT 才更需要了解喔!因為在進行 project、比賽、研究等等任務時,我們拿 Google 預訓練的 BERT 來用,這時候必須關注的重點就是如何讓我們的 Data 與預訓練模型完美結合,要微調哪些地方才能有更好的結果。那麼,廢話不多說,我們直接進入主題吧!
根據上圖,BERT 背後的開發人員添加了一組特定的規則來表示模型的輸入文字。BERT 的輸入必定是一個完整的文本序列,進而輸出此文本序列中每個詞語對應的多維向量。圖中,最上層粉色區塊就是文本的輸入(預處理後的 raw data),每一項輸入都會經過底下三層 BERT 需要的 3 個 embeddings(這邊屬於 BERT 模型的一部份,預訓練時隨機初始化,並隨著模型的訓練而得到改善。我們在 Fine tuning 時引用 BERT 時是不需要自己手動輸入的)。
接下來,我們由圖片的下方至上方來解釋 Position Embeddings, Segment Embeddings 和 Token Embeddings 是什麼。
Position Embeddings(位置嵌入):BERT 學習並使用位置嵌入來表示單詞在句子中的位置。添加這些功能是為了補足 Transformer 的限制。與 LSTM 這種 RNN 不同,BERT 是同時輸入做「平行計算」,無法自然獲取順序或序列資訊,故需要此「特殊手段」加強。
Segment Embeddings(分段嵌入):BERT 可以將句子以成對的方式作為任務的輸入(如問答句型)。每一段文字都有自己所屬獨特的嵌入,以利模型區分,第一個句子的每一個詞對應相同的 Segment Embedding,第二句的每一個詞對應第二種(相同的) Segment embedding。 在上面的例子中,所有標記為 EA 的字都屬於句子 A(my dog is cute),EB 亦然。
Token Embeddings(詞嵌入):最淺層嵌入,只代表詞語的淺層特徵,沒有上下文脈絡。由 WordPiece 標記詞彙表中所標記的詞彙學習而來。
最終,BERT 其 input 是統整相應的 Token、Segment 和 Position Embeddings 來建構的。
另外補充一下 BERT 的 tags:
在這個階段 BERT 以兩個任務來做訓練:
遮罩語言模型 (Masked Language Modeling, MLM)
下一句子預測 (Next Sentence Prediction, NSP)
試想現在有一句 input 「我喜歡閱讀 iT 邦幫忙上的鐵人賽文章」。我們想訓練一個語言模型來預測字詞時,我們不需要單純嘗試訓練它預測序列中的下一個單詞,而是建立一個模型,從「序列本身」去預測缺失的單詞。因此,依照這個思路,我們將「iT 邦幫忙」替換為 [MASK]:「我喜歡閱讀 [MASK] 上的鐵人賽文章」,再去對模型進行訓練,使其能够預測「iT 邦幫忙」這個缺失的詞。其實簡單來說,就是給 BERT 克漏字測驗。
BERT 的開發者還提出了一些改進該方法的注意事項:
為了防止模型過於關注被掩蓋的特定位置或標記,研究人員會隨機遮罩了 15% 的單詞。
被遮罩起來的字並不會永久地被 [MASK] 替換,在 Fine-tuning 期間,[MASK] 標記不會出現。
詳細規則如下:
遮罩語言模型(MLM)學習理解單詞之間的關係。 但是,文本中句子與句子之間的關聯也非常重要,故針對理解句子之間關係的任務,BERT 接受的是下一句子預測(NSP)的訓練,問答系統就是很適合詮釋此種任務的例子。
下一句子預測之任務很簡單,首先給定兩句話—— A 和 B,然後讓 BERT 去判斷 B 是語料庫中 A 之後的下一句子,還是語料庫中一句隨機句子。這其實就是一項二元分類任務。
如同 MLM 任務,BERT 開發者也在此任務添加了一些規定,假設我們有一個 100,000 句的 data set。由於是二元分類任務,將有 50,000 句作為 training data 或其相應之成對句子:
結合了遮罩語言模型和下一句子預測訓練的 BERT 就是一個不專門為某一個特定任務所訓練而生的「任務無偏」(task-agnostic)模型。
今天 BERT 的介紹就到這邊,明天見~